﻿/**
* 坐标帮助类。
*/
Ext.define('Happy.designer.PointUtil', {
    singleton: true,

    /**
     * 创建直线路径。
     * 
     * @public
     * @param {Array} points 坐标数组
     * @return {String} 路径
     */
    createLinePath: function (points) {
        var path = '';

        Ext.Array.each(points, function (point, index) {
            if (index == 0) {
                path += 'M ';
            }
            else {
                path += ' L ';
            }

            path += point.x + ' ' + point.y;
        });

        path += ' Z';

        return path;
    },

    /**
     * 创建箭头坐标数组。
     * 
     * @public
     * @param {Object} end 顶点坐标
     * @param {Number} angle 箭头角度
     * @param {Number} angle 箭头长度
     * @return {Array} 箭头坐标数组
     */
    createArrawPoints: function (end, angle, length) {
        var tan = Math.tan(75 * Math.PI / 180);
        var size = length / tan;

        var points = [
            {
                x: 0,
                y: 0
            },
            {
                x: -length,
                y: -size
            },
            {
                x: -length,
                y: size
            }
        ];

        points = this.rotate(points, angle);

        return this.move(points, end);
    },

    /**
     * 坐标批量移动。
     * 
     * @public
     * @param {Array} points 坐标数组
     * @param {Object} to 移动后的中心坐标
     * @return {Array} 移动后的坐标数组
     */
    move: function (points, to) {
        return Ext.Array.map(points, function (point) {
            return {
                x: to.x + point.x,
                y: to.y + point.y
            };
        });
    },

    /**
     * 坐标批量旋转。
     * 
     * @public
     * @param {Array} points 坐标数组
     * @param {Number} angle 角度
     * @return {Array} 旋转后的坐标数组
     */
    rotate: function (points, angle) {
        var cos = Math.cos(angle);
        var sin = Math.sin(angle);

        return Ext.Array.map(points, function (point) {
            return {
                x: cos * point.x - sin * point.y,
                y: cos * point.y + sin * point.x
            };
        });
    },

    /**
     * 计算角度。
     * 
     * @public
     * @param {Object} start 开始坐标
     * @param {Object} end 结束坐标
     * @return {Number} 角度
     */
    angle: function (start, end) {
        return Math.atan2(end.y - start.y, end.x - start.x);
    },

    /**
     * 计算距离。
     * 
     * @public
     * @param {Object} start 开始坐标
     * @param {Object} end 结束坐标
     * @return {Number} 距离
     */
    distance: function (start, end) {
        var me = this;

        start = me.createPoint(start);

        end = me.createPoint(end);

        return Math.sqrt(Math.pow(end.y - start.y, 2) + Math.pow(end.x - start.x, 2));
    }
});

